//
// Created by Jisam on 30/09/2024 5:24 PM.
// Solution of  小鸟的设备
// 2024-09-30 17:51:54 WA 90 右边界开的太小 INT_MAX 不够
// 2024-09-30 17:53:21 AC 100

#include <bits/stdc++.h>

#define  int long long
#define  endl "\n"
#define double long double
using namespace std;


signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);

    double n, p; // 定义两个双精度浮点数变量，分别用于存储对数和总预算
    cin >> n >> p; // 从标准输入读取对数和总预算

    vector<int> a(n), b(n); // 定义两个整数向量a和b，分别存储每对中的两个整数
    double sum = 0; // 定义一个双精度浮点数变量sum，用于存储a中所有元素的和

    // 读取每对整数，并计算a的总和
    for (int i = 0; i < n; i++) {
        cin >> a[i] >> b[i];
        sum += a[i];
    }

    // 如果a的总和小于或等于预算p，则输出-1.000000并结束程序
    if (sum <= p) {
        cout << -1.000000 << endl;
        return 0;
    }

    // 定义一个lambda函数check，用于检查给定的x值是否满足条件
    auto check = [&](double x) {
        double e = p * x; // 计算预算的x倍
        sum = 0; // 重置sum为0
        // 遍历每对整数，如果a[i] * x小于或等于b[i]，则不增加sum
        // 否则，将(a[i] * x - b[i])加到sum上
        for (int i = 0; i < n; i++) {
            if (a[i] * x <= b[i]) {
                continue;
            }
            sum += (a[i] * x - b[i]);
        }
        // 返回sum是否小于或等于e
        return sum <= e;
    };

    double l = 0, r = 1e10; // 定义二分查找的左右边界
    // 使用二分查找算法找到满足条件的最小x值
    while (r - l > 1e-6) {
        double mid = (l + r) / 2; // 计算中间值
        // 根据check函数的结果更新左右边界
        (check(mid) ? l : r) = mid;
    }

    // 输出找到的最小x值，保留10位小数
    cout << fixed << setprecision(10) << r << endl;

    return 0;

}